iT邦幫忙

2024 iThome 鐵人賽

DAY 19
0
Python

用 Python 打造你的 Discord BOT系列 第 19

[Day 19] 日誌系統

  • 分享至 

  • xImage
  •  

到目前為止,這系列文章已經介紹了非常多的功能,我想,各位應該也遇過不少 Bug 了。所以,差不多是時候來介紹一下 Discord BOT 的日誌系統與錯誤處理 XD

進度

如果這系列文章有分階段的話,今天開始應該算第三階段 (第一階段是入門,第二階段是重要功能介紹)。這階段的內容都會比較偏向 Discord BOT 的維護 (e.g. 日誌系統、錯誤處理、檔案拆分) 與部屬。

今天要介紹的日誌系統,雖然被分類在 Discord BOT 設定中,但考量到希望它能夠與錯誤處理一起討論,所以刻意留到等大部分功能就介紹完才回頭寫這個主題。

日誌系統

不知道大家有沒有注意過,其實在執行 Discord BOT 時,Terminal 所印出來的就是 Log 訊息 (第一次執行 Discord BOT Quickstart 就有了)。

可以看到,預設的 Log 訊息包含了日期、時間、Log 層級、logger 名稱、訊息,甚至還有設定顏色 XD

discord.py 的日誌系統,其實使用的是 python 的 logging 模組,並且有預留參數在 client.run 中。知道這件事之後,其實就有很多可以玩的東西了,接下來會開始介紹幾個常見的調整和應用。

自己添加 Log 紀錄

如果想要自己手動添加 Log 紀錄的話,可以用這個方式取得 logger

logger = logging.getLogger('discord')

之後,只要在有需要的地方加上 log 就好。

@bot.command()
async def ping(ctx: commands.Context):
    logger.info("Ping Pong!")
    await ctx.send("Pong!")

觸發後,就可以在 terminal 看到剛剛 Log 紀錄。

調整日誌系統

如果對於日誌系統的預設設定不滿意的話,也可以進行調整。在 client.run 中,有預留幾個參數:

  • log_handler
  • log_formatter
  • log_level
  • log_rooter

接下來,就直接舉幾個比較常見的需求為例,讓大家更直接地知道這些參數怎麼使用。

把 Log 寫入檔案

import logging

handler = logging.FileHandler(filename='discord.log', encoding='utf-8', mode='w')

client.run(token, log_handler=handler)

檔案打開來長這樣:

關閉 Log

client.run(token, log_handler=None)

調整 Log 層級

import logging

client.run(token, log_level=logging.DEBUG)

如果 Discord BOT 需要開發比較特殊的功能,可以把 Log 層級調低,會多很多可以參考資訊。這邊我就截一小部分給大家感受一下 (一樣只是用 Quickstart 範例程式啟動而已)。

調整 Log 內容的格式

import logging

dt_fmt = "%Y-%m-%d %H:%M:%S"
formatter = logging.Formatter(
    "{asctime} | {levelname:<8} | {filename}:{funcName}:{lineno} - {message}",
    dt_fmt,
    style="{",
)

client.run(token, log_formatter=formatter,)

如果想要紀錄更詳細的內容,也可以直接修改 Log 格式。上面的程式碼的效果如下:

統一設定所有的 logger

這個應該比較少用到

discord.py 其實有很多個 logger,光是 Quickstart 範例就會觸發到 2 個 (discord.clientdiscord.gateway),而且除了 discord 系列之外,也還有其他的。前面那些改動都只是針對 discord 系列,如果全部都要一起調整的話,就加上 root_logger=True 就好。

client.run(token, log_handler=handler, root_logger=True)

想知道到底有哪些 logger 的讀者,可以執行這段程式碼:

import logging

for key in logging.Logger.manager.loggerDict:
    print(key)

其他

如果上面這幾種都還無法滿足需求,其實也可以再更深入地去研究 python 的 logging 模組 (官方教學),或甚至用其他 log 相關的模組把它覆蓋掉。

偷偷推廣一下我去年寫的文章,介紹了 FastAPI 日誌系統的設定,有許多觀念是相通的~

小結

今天介紹了 discord.py 的日誌系統的設定,明天會接著介紹 Discord BOT 的錯誤處理。

明天竟然真的要放颱風假了XD
/images/emoticon/emoticon37.gif


上一篇
[Day 18] 投票 Poll
下一篇
[Day 20] 錯誤處理
系列文
用 Python 打造你的 Discord BOT31
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言